#pragma once

#include <queue>
#include <mutex>
#include <pthread.h>

// 命名空间，避免冲突
namespace HQ
{
#define DEF_SIZE 10

    template<class T>
    class BlockQueue
    {
    public:
        BlockQueue(size_t cap = DEF_SIZE)
            :_cap(cap)
        {
            // 初始化锁与条件变量
            pthread_mutex_init(&_mtx, nullptr);
            pthread_cond_init(&_cond, nullptr);
        }

        ~BlockQueue()
        {
            // 销毁锁与条件变量
            pthread_mutex_destroy(&_mtx);
            pthread_cond_destroy(&_cond);
        }

        // 生产数据（入队）
        void Push(const T& inData);

        // 消费数据（出队）
        void Pop(T* outData);
    private:
 
        // 判断是否为满
        bool IsFull();
        
        // 判断是否为空
        bool IsEmpty();

    private:
        std::queue<T> _queue;
        size_t _cap; // 阻塞队列的容量
        pthread_mutex_t _mtx; // 互斥锁（存疑）
        pthread_cond_t _cond; // 条件变量（存疑）
    };
}
